<?php
require_once (PASTA_DAO."Administrador.class.php");
require_once (FWK_UTIL."Utf8Parsers.class.php");
/**
 * Classe de controle de sessão do usuário
 *
 * @author André Coura
 * @since 1.0 - 23/07/2011
 */
class ControlSessao {

	private $_strSession;
	private $_objAdministrador;
	private $arrDadosSessao = null;

	public function __construct() {
		if (!isset($_SESSION)) {
			session_start();
		}
	}

	/**
	 * Busca a Sessão corrente se ela existir
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 * @param String $strSessao nome da sessão a ser resgatada
	 */
	public function getObjSessao($strSessao) {
		self::verificaTempoSessao($strSessao);
		if (!isset($_SESSION[$strSessao])){
			self::setVisitante($strSessao);
		}
		return unserialize($_SESSION[$strSessao]);
	}
	
	/**
	 * Busca a Sessão corrente se ela existir
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 * @param String $strSessao nome da sessão a ser resgatada
	 */
	public function getArrSessao($strSessao) {
		self::verificaTempoSessaoSite($strSessao);
		if (!isset($_SESSION)){
			return null;
		}
		if (!array_key_exists($strSessao, $_SESSION)){
			return null;
		}
		return unserialize($_SESSION[$strSessao]);
	}

	private function verificaTempoSessao($strSessao) {
		if (!isset ($_SESSION[$strSessao]) && $_SESSION[$strSessao] == null)
			return;
		$objAdministrador = unserialize($_SESSION[$strSessao]);
		if (((double) time() - (double) $objAdministrador->getDataLogin()) > (double) TEMPO_SESSAO_FWK) {
			self::dieSessao($strSessao);
		} else {
			$objAdministrador->setDataLogin(time());
			$_SESSION[$strSessao] = serialize($objAdministrador);
		}
	}
	
	private function verificaTempoSessaoSite($strSessao) {
		if (!isset($_SESSION) || !isset ($_SESSION[$strSessao]) || $_SESSION[$strSessao] == null)
			return null;
		$arrSessao = unserialize($_SESSION[$strSessao]);
		if (((double) time() - (double) $arrSessao["data_login"]) > (double) TEMPO_SESSAO_FWK) {
			self::dieArrSessao($strSessao);
		} else {
			$arrSessao["data_login"] = time();
			$_SESSION[$strSessao] = serialize($arrSessao);
		}
	}
	
	/**
	 * Define uma nova sessão
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 * @param String $strSessao nome da sessão a ser criada
	 * @param Array vetor contendo os dados do usuário a ser registrado na sessão
	 */
	public function setUserSessao($strSessao, $arrDadosUser) {
		self::defineSessao($arrDadosUser);
		self::setSessaoAdministrador($strSessao);
	}
	
	/**
	 * Define uma nova sessão
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 * @param String $strSessao nome da sessão a ser criada
	 * @param Array vetor contendo os dados do usuário a ser registrado na sessão
	 */
	public function setArrSessao($strSessao, $arrDadosSessao) {
		$arrDadosSessao["data_login"] = time();
		$this->arrDadosSessao = Utf8Parsers::arrayUtf8Encode($arrDadosSessao);
		$_SESSION[$strSessao] = serialize($this->arrDadosSessao);
	}
	
	/**
	 * Define a sessão do visitante
	 *
	 * @author André Coura
	 * @since 1.0 - 23/07/2011
	 * @param String $strSessao nome da sessão a ser criada
	 * @param String nome da sessão
	 */

	public function setVisitante($strSessao) {
		self::defineSessaoVisitante();
		self::setSessaoAdministrador($strSessao);
	}

	public function setObjAdministrador($objAdministrador) {
		$this->_objAdministrador = $objAdministrador;
	}

	private function getObjAdministrador() {
		if (!$this->_objAdministrador)
			$this->_objAdministrador = new Administrador();
		return $this->_objAdministrador;
	}

	/**
	 * Define os dados que serão salvos na sessão
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 * @return void
	 */
	public function defineSessao($arrDadosUser) {
		self::getObjAdministrador()->setObjAdministrador($arrDadosUser);
		self::setObjAdministrador(self::getObjAdministrador());
	}

	/**
	 * Método para registrar o objeto usuário serializado na sessão
	 *
	 * @author André Coura
	 * @since 1.0 - 23/07/2011
	 * @param String Nome que terá a sessão
	 * @return Void
	 */
	public function setSessaoAdministrador($strSession) {
		$this->_strSession = $strSession;
		session_name($strSession);
		$_SESSION[$strSession] = serialize(self::getObjAdministrador());
	}

	/**
	 * Define os dados de um visitante, ou usuário ainda não logado
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 * @return void
	 */
	private function defineSessaoVisitante() {
		self::getObjAdministrador()->setIdAdministrador("0");
		self::getObjAdministrador()->setNomeAdministrador("Visitante");
		self::getObjAdministrador()->setEmailUser("visitante@email.com");
		self::getObjAdministrador()->setIpAdministrador($_SERVER["REMOTE_ADDR"]);
		if(isset($_SERVER["REMOTE_HOST"]))
			self::getObjAdministrador()->setHostAdministrador($_SERVER["REMOTE_HOST"]);
		self::getObjAdministrador()->setGrupoAdministrador("0");
		self::getObjAdministrador()->setDataLogin(time());
	}
	/**
	 * Verifica se a sessão passada esta criada
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 * @param String $strSessao nome da sessao
	 * @return bool
	 */
	public function verifSessao($strSessao) {
		return $_SESSION[$strSessao] ? true : false;
	}
	/**
	 * Mata a sessao aberta
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 */
	public function dieSessao($strSessao) {
		unset ($_SESSION[$strSessao]);
		session_destroy();
		self::setVisitante($strSessao);
	}
	
	/**
	 * Mata a sessao aberta
	 *
	 * @author André Coura <andreccls@gmail.com>
	 * @since 1.0 - 23/07/2011
	 */
	public function dieArrSessao($strSessao) {
		unset ($_SESSION[$strSessao]);
		session_destroy();
	}

}
?>